#ifndef  _VSWRC003_H
#define _VSWRC003_H

typedef signed char SBYTE;
typedef unsigned char UBYTE;
typedef unsigned char BYTE;
typedef signed short SWORD;
typedef unsigned short UWORD;
typedef signed int SINT;
typedef unsigned int UINT;
typedef signed long SDWORD;
typedef unsigned long UDWORD;


//汎用********************************************************************/
/*CPU初期化
CPU全体の初期化関数。Sync()関数で利用する周波数を与える。
引数：Sync関数の同期周波数（単位はHz、30Hz以上)
戻り値：無し*/
void Init(BYTE MainCycle);

/*ボタン状態取得
CPUボード上の押しボタンの状態を取得する　
引数：　無し
戻り値：　0:off　1:on
*/
BYTE getSW();

/*LED制御
CPUボード上の２つのLEDを制御する関数
引数：　0:消灯　1:緑　2:オレンジ　3：両方
戻り値：　無し
*/
void LED(BYTE LedOn);

/*時間待ち　
引数：　待ち時間（単位：msec）
戻り値：　無し
*/
void Wait(int msec);

/*同期関数
Init()関数で設定した周波数で同期し、処理を戻す関数。
例：Maincycle を60Hzに設定した場合、以下のソースでは、処理Aが60Hzで実行される。
ただし、処理Aが1/60sec以上かかる場合は意味を成さない。
while(1){
	Sync();
	処理A;
}

引数：　無し
戻り値：　内部で待ったカウント（単位無し）。０の場合、設定した周波数で同期できていない。
			
*/
UINT Sync();

/*Sync関数の同期周波数取得
Initで設定した同期周波数を取得する
引数：　無し
戻り値：　同期周波数（Hz）
*/
BYTE getMainCycle();


//モータ********************************************************************/
/*モータの駆動
設定した速度でモータを駆動。呼び出した後はその状態を保持し、制御値に0を与えるまで停止しない。

引数：　モータの制御値
		0		：フリー
		0x80	：ブレーキ
		CW_MAX	：0x7F　(127)
		CCW_MAX	：0x81　(-127)
戻り値：　無し
*/
void Mtr_Run(BYTE mt1,BYTE mt2,BYTE mt3,BYTE mt4);

/*モータドライバイネーブル
WRC004搭載時、モータドライバを使用するかサーボを使用するか選択
引数：　 0:サーボ　1:モータドライバ
戻り値：　無し
*/
void WRC004_MtrEn(BYTE value);

//**************************************************************************/

/*サーボパワーオン
サーボのパルスを出力するかしないかを選択（脱力機能）
引数：　b3：SV4
		b2：SV3
		b1：SV2
		b0：SV1
戻り値：無し
*/
void Sv_PawerOn(BYTE value);

/*サーボ角度、遷移時間の設定
サーボの角度、遷移時間を同時に設定。
遷移終了を待たずに元の処理に戻る。
VS-SV092Jの場合1度は100

引数：　deg0：SV1角度
		deg1：SV2角度
		deg2：SV3角度
		deg3：SV4角度
		Step：遷移時間（1step = 1/60sec)
戻り値：無し
*/
void Sv_Move(int deg0,int deg1,int deg2,int deg3,unsigned int Step);

/*サーボ角度と遷移時間の設定（待ち有り）
サーボの角度、遷移時間を同時に設定。
遷移終了まで待ち、処理に戻る
引数：　同上
戻り値：　無し
*/
void Sv_Move_Wait(int deg0,int deg1,int deg2,int deg3,unsigned int Step);

/*AD入力値取得
A/D変換の入力値を取得。
引数：　チャンネル（0～7　=　1～8)
戻り値：　A/D変換の値(0～1023)
*/
UINT AdRead(BYTE ch);


/*シリアル通信********************************************************************/
#define SCI_RB_SIZE 40	//受信バッファ

/*ボーレート*/
enum brd{
CBR_115200 = 3,
CBR_57600 = 7,
CBR_38400 = 11,
CBR_19200 = 23,
CBR_14400 = 31,
CBR_9600 = 47,
CBR_4800 = 95,
CBR_2400 = 191,
};

/*パリティ*/
enum Parity{
even,
odd,
non
};

/*初期化
シリアル通信を使用する前に初期化が必要。
引数：　baudrate　：　ボーレートの指定（上記列挙子から指定）
		parity　：　パリティの設定（上記列挙子から指定）
		stop　：　ストップビット長の設定（0～2）
戻り値：無し
*/
void InitSci3(BYTE baudrate,BYTE parity ,BYTE stop);

/*1バイト受信
シリアル通信で1バイト受信する関数。
（実際にはバッファから1バイトのみ持ってくる）
引数：　受信データを入れる変数のポインタ
戻り値：	0：バッファが空
			1：バッファにデータ有り		
*/
BYTE SciByteRx(BYTE *data);

/*1バイト送信
シリアル通信で1バイト送信する関数。
引数：　送信データ
戻り値：　無し
*/
void SciByteTx(BYTE data);

/*文字列送信
文字列orバイトデータの配列を送信する関数。
引数：　*str：送信する文字列のポインタ
		dataleng：送信する文字数
戻り値：　無し。
*/
void SciStrTx(BYTE *str,UINT dataleng);


//ブザー********************************************************************/
/*音程、ボリュームの設定
ブザーを鳴らす際の音程とボリュームを設定
引数：　pitch：音程の設定（0～255、値が大きいほど低い音）
		vol：ボリュームの設定（0～128）
戻り値：無し
*/
void BuzzerSet(BYTE pitch , BYTE vol);
/*開始
ブザーを鳴らし始める。BuzzerStop()関数を呼ぶまでなり続ける。
引数：無し
戻り値：無し
*/
void BuzzerStart();
/*停止
ブザーを止める。
引数：無し
戻り値：無し
*/
void BuzzerStop();


//PSPAD********************************************************************/
/*PADデータ更新
getPADで取得するPADデータのバッファを最新の情報に更新。
呼び出さない場合、getPADで同じタイミングのデータが取得される。
定期的に呼び出すことが必要。
引数：無し
戻り値：無し
*/
void updatePAD();

/*データ取得
バッファからパッドの状態データを取得する。
引数には列挙子PADDATAから必要なものを指定

引数：　取得するデータの番号（列挙子からの指定でOK）
戻り値：　パッドの状態データ
*/
BYTE getPAD(BYTE num);

/*
		b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0
B1：	左 | 下 | 右 | 上 |ｽﾀｰﾄ| R3 | L3 |ｾﾚｸﾄ
B2：	□ | × | ○ | △ | R1 | L1 | R2 | L2 
AN_*X：	左:00h,中心:80h,右:FFh
AN_*Y：	上:00h,中心:80h,下:FFh
*/
enum PADDATA{
PAD_B1,			//ボタン1バイト目
PAD_B2,			//ボタン2バイト目
PAD_AN_RX,		//右アナログスティック左右
PAD_AN_RY,		//右アナログスティック上下
PAD_AN_LX,		//左アナログスティック左右
PAD_AN_LY		//左アナログスティック上下
};


//ユーザ使用不可

/*割り込み用関数
割り込み処理用。ユーザが使用不可*/
BYTE intsci3();

/*割り込み用関数
パル主出力のための割り込み処理
ユーザは使用しない*/
unsigned char Int_Sv();

/*初期化
Init()で設定されるため使用しない*/
void InitSv();

/*初期化
Initで設定されているため、再度呼び出す必要はない。
*/
void InitMtrPwm();

/*割り込み用関数
割り込み処理に仕様。ユーザが使用することはない。
*/
BYTE Int_Pwm();

#endif
